package com.password.services;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import com.password.entity.User;
import com.password.util.DesUtil;
import com.password.util.RSAEncryptUtil;
import com.password.util.SystemConfig;

/**
 * 文本加密服务，适用于短文本加密，如果是长文本，其效率会比较低;如果要加密文档，应该使用{@code FileSecretService}来进行加密
 * 
 * @author yzh
 * @date 2020年5月27日
 *
 */
public class TextSecretService {

	private final UserService userServices = UserService.getUserServices();

	private TextSecretService() {
	}

	private static class TextSecretServiceBuilder {
		private static TextSecretService textSecretService = new TextSecretService();
	}

	public static TextSecretService getTextSecretService() {
		return TextSecretServiceBuilder.textSecretService;
	}

	/**
	 * 
	 * @author yzh
	 * @date 2020年5月27日
	 * 
	 * @param user     用户名
	 * @param password 密码
	 * @param text     加密的文档
	 * @return 加密的文本内容
	 * @throws Exception
	 */
	public String encordText(String user, String password, String text) throws Exception {
		User userD = userServices.getUser(user, password);
		return encordText(userD, text);
	}

	public String encordText(User userD, String text) throws Exception {
		String publicKey = userD.getRsaKey();
		return RSAEncryptUtil.encrypt(text, publicKey);
	}

	/**
	 * 
	 * @author yzh
	 * @date 2020年5月27日
	 * 
	 * @param userName     用户名
	 * @param password 密码
	 * @param encord   加密的文档
	 * @return 加密后的文本内容
	 * @throws Exception
	 */
	public String decordText(String userName, String password, String encord) throws Exception {
		User user = userServices.getUser(userName, password);
		return decordText(user, encord);
	}

	public String decordText(User user, String encord) throws Exception {
		File file = new File(SystemConfig.getContextPath(), SystemConfig.getUserPrivateKeyFileName(user.getUserName()));
		try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));) {
			String privateKey = reader.readLine();
			return RSAEncryptUtil.decrypt(encord, DesUtil.decrypt(privateKey, user.getFixedDexKey(), "UTF-8"));
		}
	}

}
